import cv2 as cv  # 导入OpenCV库
import numpy as np  # 导入NumPy库

imgForSearch = cv.imread('../test_datas/messi5.jpg', 0)  # 读取待搜索的原图，灰度模式
imgTemplate = cv.imread('../test_datas/messi_face.jpg', 0)  # 读取模板图像，灰度模式
w, h = imgTemplate.shape[::-1]  # 获取模板的宽和高（注意shape拼写）

# 定义所有可用的模板匹配方法
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED',
           'cv.TM_CCORR', 'cv.TM_CCORR_NORMED',
           'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED']

# 遍历所有匹配方法
for meth in methods:
    imgForDraw = imgForSearch.copy()  # 在原图上绘制矩形，防止覆盖模板
    method = eval(meth)  # 获取方法对应的常量
    print(type(meth), type(method))  # 打印类型，便于调试

    res = cv.matchTemplate(imgForSearch, imgTemplate, method)  # 进行模板匹配

    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)  # 获取极值及其位置
    if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:  # 如果是平方差匹配，最小值为最佳匹配
        top_left = min_loc
    else:
        top_left = max_loc  # 其他方法最大值为最佳匹配

    bottom_right = (top_left[0] + w, top_left[1] + h)  # 计算矩形右下角坐标
    cv.rectangle(imgForDraw, top_left, bottom_right, 255, 2)  # 在原图上绘制匹配结果矩形
    cv.normalize(res, res, 0, 1, cv.NORM_MINMAX, -1)  # 归一化匹配结果，便于显示

    cv.imshow("matchRes", res)  # 显示匹配结果图
    cv.imshow("imgForDraw", imgForDraw)  # 显示绘制了矩形的原图
    cv.waitKey(0)  # 等待按键

cv.destroyAllWindows()  # 关闭所有窗口
